package linyunshi.rbac.service.array;

import linyunshi.rbac.domain.dto.RoleDto;
import linyunshi.rbac.domain.entity.Role;
import linyunshi.rbac.domain.vo.RoleVo;
import linyunshi.rbac.domain.vo.Result;
import linyunshi.rbac.service.IRoleService;
import linyunshi.rbac.service.IUserService;


/**
 * 业务层-角色
 *
 * @author linyunshi
 * @since 2025/6/3 12:16
 */

//业务层的实现
public class RoleService extends BaseService<Role,RoleDto,RoleVo> implements IRoleService {

    private IUserService userService;


    private static RoleService singleton;

    private RoleService() {
        data = new Role[DATA_SIZE + 1];
        temp = new RoleVo[DATA_SIZE];
    }

    public static RoleService getInstance() {
        if( singleton == null ) {
            singleton = new RoleService();
        }
        return singleton;
    }



    /**
     * 将Role对象转换为RoleVo对象。
     * 作用：通过将实体对象转化为视图对象。
     */
    @Override
    RoleVo convertToVo(Role role) {
        return new RoleVo(role.getId(),role.name,role.dataScope);
    }

    //封装dto。从创建一个entity的过程。
    @Override
    Role createEntity(RoleDto dto , int id) {
        return new Role(id,dto.name,dto.dataScope);
    }

    @Override
    void updateEntity(RoleDto dto,Role role) {
        role.name = dto.name;
        role.dataScope = dto.dataScope;
    }

    /**
     * 删除角色信息
     * 视图层仅能看到id，所以这里的参数是id。
     */
    @Override
    public Result delete (int id) {
        //判断id是否存在
        if(!existsById(id)) {
            return Result.failure("删除失败，不存在该数据");
        }

        /**
         * 需要的时候 才进行初始化
         */
        if( userService == null) {
            userService = UserService.getInstance();
        }

        //判断是否能删除
        if(userService.roleInUse(id)) {
            return Result.failure("删除失败，还有用户具有该角色,不能删除");
        }
        data[id] = null;//将该id对应的数据置为null。（存在时）
        return Result.success("删除成功", null);
    }
}
